#include "threadPool.h"

// 处理puts命令，即接收文件
int puts_work(const client_info_t *client_info)
{
    int netfd = client_info->netfd;
    train_t train;
    bzero(&train, sizeof(train));

    // 接收文件名（路径）
    char path[1024] = {0};
    int path_len;
    recv(netfd, &path_len, sizeof(int), MSG_WAITALL);
    recv(netfd, path, path_len, MSG_WAITALL);
    
    char file_name[1024];
    int i;
    for(i = path_len - 1; i > 0; i--){
        if(path[i] == '/'){
            //路径从后往前的第一个'/'
            break;
        }
    }
    if(i){
        //把从后往前第一个'/'后面的内容赋值给file_name
        strcpy(file_name, (path + i + 1));     
    }else{
        // i==0,意味path存的就是个文件名
        strcpy(file_name, path);
    }
    printf("要创建的文件名为: %s\n",file_name);
    
    char absolute_path[1024] = {0};
    strcpy(absolute_path, client_info->global_path);
    strcat(absolute_path, file_name);

    printf("要创建的文件路径为: %s\n",absolute_path);
    
    // 创建文件
    int file_fd = open(absolute_path, O_RDWR | O_CREAT, 0666);
    ERROR_CHECK(file_fd, -1, "open");

    // 读取文件的长度
    off_t file_size;
    recv(netfd, &file_size, sizeof(off_t), MSG_WAITALL);
    printf("下载到的文件的大小为：%ld\n", file_size);

    // 读取客户端传过来的内容，并且写入文件
    if(file_size >= BIGFILE) {
        // 大文件
        ftruncate(file_fd, file_size);
        char *p = (char *)mmap(NULL, file_size, PROT_READ | PROT_WRITE,MAP_SHARED, file_fd, 0);
        recv(netfd, p, file_size, MSG_WAITALL);
        munmap(p, file_size);
    } else {
        // 小文件
        while(1){
            recv(netfd, &train.len, sizeof(train.len), MSG_WAITALL);
            if(train.len == 0){
                break;
            }
            recv(netfd, train.data, train.len,MSG_WAITALL);
            write(file_fd, train.data, train.len);
        }
    }
    printf("文件下载完成！\n");
    close(file_fd);

    return 0;
}